from pathlib import Path
import random
import time

from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
from bs4 import BeautifulSoup

from browser import Browser
import proxy_with_authorization


class Parser(Browser):

    """ Этот класс представляет парсер """

    def __init__(self, data, proxy_list=None):

        self.display_browser = data[0]
        self.link_to_page = data[2]
        self.proxy_list = proxy_list


    def wait(self, f=2, b=3.5):

        """ Чуть-чуть подождать """

        number = random.uniform(f, b)
        print(f'Ждем {number}\n')
        time.sleep(number)


    def get_saved_page(self, file_name):

        """ Открыть сохраненную страницу для парсинга и возвращаем ее """

        folder = Path('saved_html/')
        page = folder/file_name

        with open(page, 'r', encoding='utf-8') as file:

            text = file.read()
            page = BeautifulSoup(text, 'lxml')

            return page


    def convert_to_bs(self, browser):

        """ Получить объект BeautifulSoup """

        html_source = browser.page_source
        page = BeautifulSoup(html_source, 'lxml')

        return page


    def click_on_button(self, element_selenium, a=.5, b=.8):

        """ Нажать на кнопку """

        element_selenium.click()    # Кликаем на элемент
        self.wait(a, b)             # Чуть-чуть ждем


    def enter_text_in_field(self, element_selenium, text, a=.5, b=.8):

        """ Ввести текст в поле """

        element_selenium.click()
        element_selenium.clear()
        element_selenium.send_keys(text)
        self.wait(a, b)


    def move_to_element(self, browser, selenium_element, a=.5, b=.8):

        """ Переместится к элементу страницы """

        action = ActionChains(browser)
        action.move_to_element(selenium_element)
        action.perform()
        self.wait(a, b)


    def scroll_the_page_js(self, browser, a=.2, b=.5, w=0, h=50):

        """
        Переместиться по странице js
        w - прокрутить страницу по ширине
        h - прокрутить страницу по высоте
        """

        browser.execute_script(f"window.scrollBy({w}, {h})")
        self.wait(a, b)


    def get_configured_browser(self, through_proxy=None, proxy=None):

        """ Получить настроенный браузер """

        if through_proxy == 'public_proxy':  # Если необходимо делать запрос через общедоступные прокси

            browser = self.get_browser(self.display_browser, through_proxy)

            return browser

        elif through_proxy == 'private_proxy':  # Если необходимо делать запрос через приватные прокси

            def get_information_for_proxy(proxy):

                pass


            # ВЫШЕ ОПРЕДЕЛЕНИЕ ФУНКЦИЙ

            host, port, username, password = get_information_for_proxy(proxy)
            browser = proxy_with_authorization.proxy_chrome(host, port, username, password)

            return browser

        else:  # Если прокси не используюется

            browser = self.get_browser(self.display_browser, through_proxy)

            return browser


    def work_on_printing_text(self, browser):

        """ Работаем над печатью текста """

        def get_text_to_enter(browser):

            """ Получаем текст для печати """

            text_to_enter = browser.find_element(
                By.XPATH,
                '//div[@id="text"]/div[1]'
            ).text
            text_to_enter = list(text_to_enter)

            return text_to_enter


        def start_typing(browser, text_to_enter):

            """ Начинаем печатать """

            def get_field_to_print(browser):

                """ Получаем поле для печати """

                field_to_print = browser.find_element(
                    By.XPATH,
                    '//input[@id="intext"]'
                )

                return field_to_print


            # ВЫШЕ ОПРЕДЕЛЕНИЕ ФУНКЦИЙ

            field_to_print = get_field_to_print(browser)

            for letter in text_to_enter:

                field_to_print.send_keys(letter)
                time.sleep(.001)

            if not '¶' == text_to_enter[-1]:

                field_to_print.send_keys(' ')

            print('Строка закончилась')


        # ВЫШЕ ОПРЕДЕЛЕНИЕ ФУНКЦИЙ

        while True:

            text_to_enter = get_text_to_enter(browser)
            start_typing(browser, text_to_enter)


    def start_parsing(self):

        """ Начать парсинг """

        browser = self.get_configured_browser()
        browser.get(self.link_to_page)

        self.work_on_printing_text(browser)
